package com.glls.lambda.demo2;

import org.junit.Test;

import java.util.Comparator;
import java.util.TreeSet;
import java.util.function.Consumer;

/**
 * @date 2022/10/3
 * @desc  lambda 表达式的语法
 *
 * Lambda 表达式在Java 语言中引入了一个新的 语法元素 和 操作符。这个操作符为 “->” ，
 * 该操作符被称 为 Lambda 操作符或剪头操作符。它将 Lambda 分为 两个部分：
 * 左侧：指定了 Lambda 表达式需要的所有参数       对应函数式接口的方法参数
 * 右侧：指定了 Lambda 体，即 Lambda 表达式要执行 的功能。   对应函数式接口的 方法体
 *
 * lambda 表达式需要函数式接口的支持  什么是函数式接口呢？ 即这个接口中的抽象方法只有一个
 * 一般来讲  函数式接口 都会使用  @FunctionalInterface  注解
 *
 * 语法格式1  无参无返回值（指的是函数式接口的方法， 咱们写的lambda 表达式 就是根据函数是接口的抽象方法写的）
 * 参考  test1 案例
 *  Runnable runnable = ()->System.out.println("run");
 *
 * 语法格式2  一个参数 无返回值  参考test2 案例
 * lambda 表达式  箭头符号 左面写的是 方法参数 方法参数 类型不用写  因为 jvm 会根据上下文推断出参数类型
 *                       右面写的是 方法体 如果方法体只有一条语句  return 和 大括号都可以省略
 *                       左面写的方法参数只有一个的话  小括号也可以省略
 *
 * 语法格式3  两个或两个以上参数  有返回值   参考案例 test3
 *      参数的小括号不能省  如果 lambda体 只有一条语句    return  和 大括号都可以省
 *
 *
 */
public class LambdaDemo2 {

    @Test
    public void test1(){
        //之前的写法
        //Runnable runnable = new Runnable() {
        //    @Override
        //    public void run() {
        //        System.out.println("run");
        //    }
        //};
        //lambda 表达式的写法
        Runnable runnable = ()->System.out.println("run");
        //
        //new Thread(runnable).start();
        //再简化
        new Thread(()->System.out.println("run")).start();
    }


    @Test
    public void test2(){
        Consumer<String> consumer = str1-> System.out.println(str1);
    }

    @Test
    public void test3(){
        Comparator<Integer> comparator = (num1,num2)-> {return  1;};
        Comparator<Integer> comparator2 = (num1,num2)-> 1;



        TreeSet<String> treeSet = new TreeSet<>((s1, s2) -> {
            return 0;
        });
        TreeSet<String> treeSet2 = new TreeSet<>((s1, s2) -> 0);

        treeSet.add("hello");
        treeSet.add("hello");
        treeSet.add("world");

        System.out.println(treeSet);
    }


    @Test
    public void test4(){
        MyInter<String,Integer> myInter = (str1,str2)->{return str1.length()-str2.length();};
        MyInter<String,Integer> myInter2 = (str1,str2)->str1.length()-str2.length();


        Integer value = myInter.getValue("hello", "helloworld");

        System.out.println(value);
    }

}
